//============================================================================================
/**
 * @file	pm_radio.c
 * @brief
 * @author
 * @date
 */
//============================================================================================
#include "common.h"

#include "data/sound/gs_sound_data.sadl"	//サウンドラベルファイル
#include "system/snd_radio.h"
//============================================================================================
/**
 *
 *
 *
 *
 *
 * @brief	ラジオプレーヤー
 *
 *
 *
 *
 *
 */
//============================================================================================
//------------------------------------------------------------------
/**
 * @brief	プレーヤー設定定義
 */
//------------------------------------------------------------------
#define RADIO_PLAYERNO		( PLAYER_OPED + 1)	// snd_system.cで作成しているプレイヤーのもう一つ下に
#define RADIO_HEAPSIZE		( 12000 )			// ラジオ再生で一番大きそうな譜面のサイズから算出
#define RADIO_CHANNNELBIT 	( 0x0a7fe )			// 使用可能チャンネルを指定（FIELD・BGMと同じはず）
#define RADIO_PLAYABLENUM 	(  1 )				// プレイヤーで同時に再生可能な譜面数
#define BGM_PL_PRI			( 64 )				// ref gs_sound_data.sarc

typedef struct {
	u32						musicIdx;
	NNSSndHandle	sndHandle;
}RADIO_PLAYER_DATA;

static RADIO_PLAYER_DATA rpd;

//------------------------------------------------------------------
/**
 * @brief	プレーヤー作成
 */
//------------------------------------------------------------------
void	PMGS_InitRadioPlayer(NNSSndHeapHandle* pSndHeapHandle)
{
	BOOL result;
	int i;

	// ハンドル初期化
	NNS_SndHandleInit(&rpd.sndHandle);
	// チャンネル設定
	NNS_SndPlayerSetAllocatableChannel(RADIO_PLAYERNO, RADIO_CHANNNELBIT);
	NNS_SndPlayerSetPlayableSeqCount(RADIO_PLAYERNO, RADIO_PLAYABLENUM);
	// プレーヤーヒープ作成
	for( i=0; i<RADIO_PLAYABLENUM; i++ ){
		result = NNS_SndPlayerCreateHeap(RADIO_PLAYERNO, *pSndHeapHandle, RADIO_HEAPSIZE);
		GF_ASSERT( result == TRUE );
	}
	rpd.musicIdx = 0;
}

extern void Snd_FieldAndBgmStop(void);

//------------------------------------------------------------------
/**
 * @brief	プレーヤー再生
 */
//------------------------------------------------------------------
BOOL	PMGS_PlayRadio(u32 musicID)
{
	BOOL result;
	const NNSSndSeqParam* param;


	Snd_FieldAndBgmStop();

	// 譜面が依存しているバンクNO取得用に情報取得
	param = NNS_SndArcGetSeqParam( musicID );

	// 曲再生
	result =  NNS_SndArcPlayerStartSeqEx(	&rpd.sndHandle,
											RADIO_PLAYERNO,
											param->bankNo,
											BGM_PL_PRI+1,	//念のためBGMより高くしておく
											musicID );

	rpd.musicIdx = (result == TRUE)? musicID : 0;

	return result;
}

//------------------------------------------------------------------
/**
 * @brief	プレーヤー停止
 */
//------------------------------------------------------------------
void	PMGS_StopRadio(int fadeFrame)
{
	// プレイヤーNOを指定して再生終了（譜面はメモリから解放されない。次回再生時に上書き）
	NNS_SndPlayerStopSeqByPlayerNo(RADIO_PLAYERNO, fadeFrame);
	rpd.musicIdx = 0;
}

//------------------------------------------------------------------
/**
 * @brief	再生中サウンドシーケンスＩＤ取得
 */
//------------------------------------------------------------------
u32		PMGS_GetRadioMusicID( void )
{
	return rpd.musicIdx;
}


//=============================================================================================
/**
 * ラジオ曲のポーズ処理
 *
 * @param   flag	TRUE:一時停止	FALSE:再生再開
 */
//=============================================================================================
void PMGS_PauseRadio( BOOL flag )
{
	// ラジオ曲のポーズ・ポーズ解除
	NNS_SndPlayerPauseByPlayerNo( RADIO_PLAYERNO,flag );

}


//=============================================================================================
/**
 * 現在PLAYER_RADIOは再生中か
 *
 * @param   none
 *
 * @retval  BOOL	TRUE:再生中		FALSE:再生停止
 */
//=============================================================================================
BOOL PMGS_RadioPlayCheck(void)
{

	// 現在ラジオプレイヤーで再生されているか
	return NNS_SndPlayerCountPlayingSeqByPlayerNo( RADIO_PLAYERNO );
}
